package br.com.werp.regras.algoritimo.controle;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import br.com.werp.regras.geral.interfaces.algoritimo.IdVirtual;


/**
 * @author Sobreira
 * Criado em 02/08/2005
 */
public class ControleIdVirtual {
    /**
     *
     */
    public ControleIdVirtual() {
        super();
    }

    /**
     * @param idVirtual
     * @param list
     *
     */
    public void criarIdVirtual(List list, IdVirtual VO) {
        int idVirtual = 0;

        for (Iterator iter = list.iterator(); iter.hasNext();) {
            IdVirtual virtualLoop = (IdVirtual) iter.next();

            if (virtualLoop.getId() >= idVirtual) {
                idVirtual = virtualLoop.getId() + 1;
            }
        }

        if (idVirtual == 0) {
            VO.setId(1);
        } else { 
            VO.setId(idVirtual);
        }

        VO.setIdVirtual(true);
        list.add(VO);
    }

    public void removerIdVirtual(List list, final String[] remover) {
        for (int i = 0; i < remover.length; i++) {
            final int cint = i;
            list.remove(new IdVirtual() {
                    public int getId() {
                        return Integer.parseInt(remover[cint]);
                    }

                    public void setId(int id) {
                    }

                    public boolean isIdVirtual() {
                        return false;
                    }

                    public void setIdVirtual(boolean idVirtual) {
                    }
                });
        }
    }

    /**
     * @param ids
     * @param idsBanco
     */
    public List gerarListaRemoverIdsReais(List ids, List idsBanco) {
        
        Set idReais = new HashSet();

        for (Iterator iter = ids.iterator(); iter.hasNext();) {
            IdVirtual idVirtual = (IdVirtual) iter.next();

            if (!idVirtual.isIdVirtual()) {
                idReais.add(idVirtual);
            }
        }
        
        List retorno = new ArrayList();


        for (Iterator iter = idsBanco.iterator(); iter.hasNext();) {
            IdVirtual idVirtual = (IdVirtual) iter.next();
            
            if (!idReais.contains(idVirtual)) {
                retorno.add(idVirtual);
                
            }
        }

        return retorno;
    }
    
    public void criarIdVirtualPrim(List list, IdVirtual VO) {
        int idVirtual = 0;

        for (Iterator iter = list.iterator(); iter.hasNext();) {
            IdVirtual virtualLoop = (IdVirtual) iter.next();

            if (virtualLoop.getId() >= idVirtual) {
                idVirtual = virtualLoop.getId() + 1;
            }
        }

        if (idVirtual == 0) {
            VO.setId(1);
        } else {
            VO.setId(idVirtual);
        }

        VO.setIdVirtual(true);
        list.add(0,VO);
    }
}
